package com.zhangjie.internalcommon.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.zhangjie.internalcommon.dto.TokenResult;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther: zj
 * @Date: 2024/1/26 - 01 - 26 - 18:34
 * @Description: com.zhangjie.internalcommon.util
 * @version: 1.0
 */
public class JwtUtils {

    // 盐
    private static final String SIGN = "IOAUL%^#@$";

    // phone
    private static final String JWT_KEY_PHONE = "phone";

    // 司机or乘客身份标识，乘客是1，司机是2
    private static final String JWT_KEY_IDENTITY = "identity";

    // token类型
    private static final String JWT_TOKEN_TYPE = "tokenType";

    // 时间不同，同k v 的token，加入该k v，使得token不同
    private static final String JWT_TOKEN_TIME = "tokenTime";

    /**
     * 生成token
     * @param phone
     * @param identity
     * @param tokenType
     * @return
     */
    public static String generatorToken(String phone, String identity, String tokenType){

        Map<String, String> map = new HashMap<>();
        map.put(JWT_KEY_PHONE, phone);
        map.put(JWT_KEY_IDENTITY, identity);
        map.put(JWT_TOKEN_TYPE, tokenType);

        // token过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, 1);// 在原日期基础上加一天，也就是token过期时间一天
        Date date = calendar.getTime();
        map.put(JWT_TOKEN_TIME, date.toString());// 使得token不同

        JWTCreator.Builder builder = JWT.create();
        // 整合map
        map.forEach((k, v) -> {// 使用lambda表达式把每个kv迭代到jwt中（即添加了n个声明内容）
            builder.withClaim(k, v);
        });
        // 整合过期时间 （这里注释有效期控制是因为 token有效期交给了redis来控制）
        // builder.withExpiresAt(date);

         // 生成token
        String sign = builder.sign(Algorithm.HMAC256(SIGN));

        return sign;
    }

    /**
     * 解析token
     * @param token
     * @return
     */
    public static TokenResult parseToken(String token){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
        String phone = verify.getClaim(JWT_KEY_PHONE).asString();
        String identity = verify.getClaim(JWT_KEY_IDENTITY).asString();

        TokenResult tokenResult = new TokenResult();
        tokenResult.setPhone(phone);
        tokenResult.setIdentity(identity);

        return tokenResult;
    }

    /**
     * 校验token，主要判断token是否异常
     * @param token
     * @return
     */
    public static TokenResult checkToken(String token){
        TokenResult tokenResult = null;
        try {
            tokenResult = JwtUtils.parseToken(token);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return tokenResult;
    }


    // test
    public static void main(String[] args) {
        String s = generatorToken("15236525079", "1", "access");
        System.out.println("生成的token："+s);
        System.out.println("解析---------");
        TokenResult tokenResult = parseToken(s);
        System.out.println("手机号：" + tokenResult.getPhone());
        System.out.println("身份：" + tokenResult.getIdentity());
    }
}
